﻿
using System.Reflection;

Type t = typeof(string);
Type t2="str".GetType();
Type t3 = Type.GetType("System.String");

/**
*       Name 数据类型名
        FullName 数据类型的完全限定名(包括命名空间名)
        Namespace 定义数据类型的命名空间名
        IsAbstract 指示该类型是否是抽象类型
        IsArray   指示该类型是否是数组
        IsClass   指示该类型是否是类
        IsEnum   指示该类型是否是枚举
        IsInterface    指示该类型是否是接口
        IsPublic 指示该类型是否是公有的
        IsSealed 指示该类型是否是密封类
        IsValueType 指示该类型是否是值类型
 * **/

Console.WriteLine( $"{t3.Name}：名称");
Console.WriteLine($"{t3.FullName}：数据类型的完全限定名(包括命名空间名)");
Console.WriteLine($"{t3.Namespace}：定义数据类型的命名空间名");
Console.WriteLine($"{t3.IsValueType}：指示该类型是否是值类型");



/***
 *  GetConstructor(), GetConstructors()：返回ConstructorInfo类型，用于取得该类的构造函数的信息
    GetEvent(), GetEvents()：返回EventInfo类型，用于取得该类的事件的信息
    GetField(), GetFields()：返回FieldInfo类型，用于取得该类的字段（成员变量）的信息
    GetInterface(), GetInterfaces()：返回InterfaceInfo类型，用于取得该类实现的接口的信息
    GetMember(), GetMembers()：返回MemberInfo类型，用于取得该类的所有成员的信息
    GetMethod(), GetMethods()：返回MethodInfo类型，用于取得该类的方法的信息
    GetProperty(), GetProperties()：返回PropertyInfo类型，用于取得该类的属性的信息
 * 
 * ***/

查看类的构造函数();

用构造函数动态生成对象();

用Activator生成对象();

查看属性();

获取公用方法();

获取公开字段();

创建对象调用方法和属性();

Console.WriteLine( "");



static void 创建对象调用方法和属性()
{
    var t = typeof(Student);
    object o = Activator.CreateInstance(t);
    var fi = t.GetField("Count");
    //获取字段给字段设置值
    fi.SetValue(o, 10);

    var p=t.GetProperty("Name");
    p.SetValue(o, "荷塘飞鱼",null);
    MethodInfo mi = t.GetMethod("GetName");
    var d1= mi.Invoke(o,null);
    Console.WriteLine("getname 返回"+ d1);

    MethodInfo mi2 = t.GetMethod("SetName");
    mi2.Invoke(o, new object[1] {"Jet"});
    MethodInfo mi3 = t.GetMethod("GetName");
    var d2=mi3.Invoke(o, null);
    Console.WriteLine("getname 返回" + d2);


}
static void 获取公开字段()
{
    Console.WriteLine("==================获取公开字段====================");
    var s = new Student();
    var t = s.GetType();
    var ps = t.GetFields();
    foreach (var item in ps)
    {
        Console.WriteLine($"字段：{item.Name}    类型：{item.FieldType.Name}");
    }

}
static void 获取公用方法()
{
    Console.WriteLine("================获取公用方法=================");
    var s = new Student();
    var t = s.GetType();
    MethodInfo[] mis = t.GetMethods();
    foreach (MethodInfo m in mis)
    {
        Console.WriteLine($"方法名： {m.Name}---返回类型：{m.ReturnType.Name}");
    }
}
static void 查看属性()
{
    Console.WriteLine("================查看属性=================");
    var s = new Student();
    var t = s.GetType();
    var ps = t.GetProperties();
    foreach (var p in ps)
    {
        Console.WriteLine($"{p.Name}     {p.PropertyType.Name}");
    }



}
static void 用Activator生成对象()
{
    Console.WriteLine("================用Activator生成对象=================");
    var t = typeof(Student);
    object o = Activator.CreateInstance(t, 5,"Jet",34);
    var s = o as Student;
    s.Learning();

}
static void 用构造函数动态生成对象()
{
    Console.WriteLine("=========用构造函数动态生成对象========");
    var t = typeof(Student);
    Type[] pt=new Type[3];
    pt[0] = typeof(int);
    pt[1] = typeof(string);
    pt[2] = typeof(int);

    var ct=t.GetConstructor(pt);
    var o = ct.Invoke(new object[3] {2,"Jet",34 });
    var s = o as Student;
    s.Learning();

}
static void 查看类的构造函数()
{
    Console.WriteLine("============查看类的构造函数=============");
    var s = new Student();
    var t = s.GetType();
    var ct = t.GetConstructors();
    foreach (var c in ct)
    {
        var param = c.GetParameters();// 每个构造函数的参数
        Console.WriteLine(param.Count() + "个参数的构造函数");
        foreach (var p in param)
        {
            Console.WriteLine($"   {p.Name}     {p.ParameterType.Name}");
        }

    }

}

public class Student {


    public int Count = 0;

    /// <summary>
    /// 字段
    /// </summary>
    public int MaxAge = 100;

    public Student()
    {
        
    }

    public Student(string name)
    {
        Name = name;
    }

    public Student(int id,string name,int age)
    {
        Id = id;
        Name = name;
        Age = age;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public void Learning()
    {
        Console.WriteLine($"{Name}，{Age}岁，{Id} 号，学习");
    }


    public string GetName()
    {
        return Name;
    }

    public void SetName(string name)
    { 
        Name=name;
    }


    private int GetAge()
    { 
        return 100;
    }




}